#include <iostream>
#include <string>
#include <vector>
#include <windows.h>
#include <dxgi.h>

#pragma comment(lib, "dxgi.lib") // 确保链接 dxgi.lib，用于 DXGI 接口


/**
 * @brief 使用 DXGI 获取第一个 GPU 型号。
 *
 * 通过 DirectX Graphics Infrastructure (DXGI) 接口，获取第一个显示适配器（GPU）的描述信息。
 *
 * @return 返回第一个 GPU 型号的字符串。如果未检测到 GPU，则返回空字符串。
 */
std::string GetGPUModel() {
    IDXGIFactory* pFactory = nullptr; // DXGI 工厂指针

    // 创建 DXGI 工厂
    if (FAILED(CreateDXGIFactory(__uuidof(IDXGIFactory), (void**)(&pFactory)))) {
        std::cerr << "Failed to create DXGI factory" << std::endl;
        return ""; // 如果创建工厂失败，返回空字符串
    }

    IDXGIAdapter* pAdapter = nullptr; // DXGI 适配器指针

    // 获取第一个显示适配器
    if (pFactory->EnumAdapters(0, &pAdapter) == DXGI_ERROR_NOT_FOUND) {
        pFactory->Release(); // 如果未找到适配器，释放工厂资源
        return ""; // 返回空字符串
    }

    // 获取适配器描述
    DXGI_ADAPTER_DESC adapterDesc;
    pAdapter->GetDesc(&adapterDesc);

    // 使用 WideCharToMultiByte 将宽字符串转换为普通字符串
    int bufferSize = WideCharToMultiByte(CP_UTF8, 0, adapterDesc.Description, -1, NULL, 0, NULL, NULL);
    std::string gpuName(bufferSize, 0);
    WideCharToMultiByte(CP_UTF8, 0, adapterDesc.Description, -1, &gpuName[0], bufferSize, NULL, NULL);

    pAdapter->Release(); // 释放适配器资源
    pFactory->Release(); // 释放工厂资源

    return gpuName; // 返回 GPU 型号
}


